//
//  HMUserAccountViewModel.swift
//  WeiBoSwift
//
//  Created by hgj on 2016/11/17.
//  Copyright © 2016年 HuGuoJian. All rights reserved.
//  业务逻辑
//  网络请求
//  数据缓存

import UIKit

 private let path = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as NSString).appendingPathComponent("userInfo.plist")

class HMUserAccountViewModel: NSObject {
    
    // 是否登录
    var userLogin: Bool {
        if userInfo?.access_token != nil && isExpires == false {
            return true
        }
        return false
    }
    
    // 是否过期
    var isExpires: Bool {
        if userInfo?.expires_date?.compare(Date()) == .orderedDescending{
            return false
        }
        return true
    }
    
    // 可以写一些属性给外部调用
    var access_token: String? {
        return userInfo?.access_token ?? ""
    }
    
    // 用户头像地址
    var headUrl: URL? {
        return URL(string: userInfo?.avatar_large ?? "")
    }
    
    // 单例 因为全局只有有个用户 一旦用户注销登陆之后就应该删除account.plist
    static let shared: HMUserAccountViewModel = HMUserAccountViewModel()
    
    var userInfo: HMUserAccount?
    
    override init() {
        // 本类是基类, 四个UI界面都要判断是否登录,为了保证后面界面验证是否登录的时候不在访问磁盘,我们将数据保存在内存中
        super.init()// 不写这句 下面调用方法就要加 self  self.loadUserInfo()
        userInfo = loadUserInfo()
    }
    

    
    // 3.获取授权过的 toKen
    func loadAccessToken(code: String,finished: @escaping (Bool) -> ()) {
        
        let urlStr = "https://api.weibo.com/oauth2/access_token"
        let parameters = ["client_id" : client_id,
                          "client_secret" : client_secret,
                          "grant_type" : "authorization_code",
                          "code" : code,
                          "redirect_uri" : redirect_uri]
        
        HMNetworkTools.shared.request (method: .POST, urlString: urlStr, parameters: parameters){ (response, error) in
            
            if error != nil {
                finished(false)
                return
            }
            
            // 请求成功  闭包用self
            self.loadUserInfo(dict: response as! [String : Any], finished: finished)
        }
        
    }
    
    // 4.获取用户信息
    private func loadUserInfo(dict: [String : Any], finished: @escaping (Bool) -> ()) {
        
        let urlStr = "https://api.weibo.com/2/users/show.json"
        let access_token = dict["access_token"]
        let uid = dict["uid"]
        let parameters = ["access_token" : access_token,
                          "uid" : uid]
        
        HMNetworkTools.shared.request(method: .GET, urlString: urlStr, parameters: parameters) { (response, error) in
            
            if error != nil {
                finished(false)
                return
            }
            
            // 成功
            // 合并两个字典
            var userIndoDict = response as! [String : Any]
            for (key,value) in dict {
                userIndoDict[key] = value
            }
            
            // 模型
            let userInfo = HMUserAccount(dict: userIndoDict)
            
            // 存
            self.saveUserInfo(userInfo: userInfo)
            
            // === 如果不写,首次登录的时候会有bug
            self.userInfo = userInfo
            
            // 回调
            finished(true)
        }
        
    }
    
    // 存 归档
    private func saveUserInfo(userInfo: HMUserAccount) {
        NSKeyedArchiver.archiveRootObject(userInfo, toFile: path)
    }
    
    // 取 解档  解档有可能没有数据 所以 用 ? 并 根据判断返回不同的结果
    private func loadUserInfo() -> (HMUserAccount)? {
        let userInfo = NSKeyedUnarchiver.unarchiveObject(withFile: path)
        
        // 所以这里要判断 返回不同的结果
        if let userInfos = userInfo as? HMUserAccount {
            return userInfos
        }
        return nil
    }
}
